import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
import api from '@/services/api' // 引入我们即将创建的 API 服务
import router from '@/router' // 引入 router 用于跳转

// 使用 defineStore 定义一个名为 'auth' 的 store
export const useAuthStore = defineStore('auth', () => {
  // --- State ---
  // 尝试从 localStorage 读取 token 初始化，|| null 确保是 null 而不是空字符串
  const token = ref(localStorage.getItem('satoken') || null)
  const user = ref(null) // 存储用户信息 (可选)
  const loginError = ref(null) // 存储登录错误信息
  const registerError = ref(null) // 存储注册错误信息
  const faceVerified = ref(localStorage.getItem('faceVerified') === 'true')

  // --- Getters ---
  // 计算属性：判断用户是否已认证 (基于 token 是否存在)
  const isAuthenticated = computed(() => !!token.value)

  // --- Actions ---
  // 登录操作
  async function login(credentials) {
    loginError.value = null // 清除旧错误
    try {
      // 调用 API 服务的 login 方法
      const response = await api.login(credentials)

      // 后端成功响应格式为
      /*
            {
                "code": 0,
                "msg": null,
                "data": {
                    "tokenName": "satoken", //用来拜访非登陆注册页面所需的cookie
                        "tokenValue": "382f8e03-fd74-49ab-99e0-92986a697053", //用来拜访非登陆注册页面所需的cookie
                        "isLogin": true,
                        "loginId": "zzz",  //user表中登录用户的主键
                        "loginType": "login",
                        "tokenTimeout": 2591999,
                        "sessionTimeout": 2591999,
                        "tokenSessionTimeout": -2,
                        "tokenActiveTimeout": -1,
                        "loginDevice": "default-device",
                        "tag": null
                }
            }
            */
      if (
        response.data &&
        response.data.code === 0 &&
        response.data.data &&
        response.data.data.tokenValue
      ) {
        // 1. 检查 code 是否为 0 (表示成功)
        // 2. 检查 data 对象是否存在
        // 3. 检查 data 对象中是否有 tokenValue (核心)

        // --- 登录成功 ---
        const responseData = response.data.data // 获取 data 字段的对象

        // 更新 token 状态 (使用 tokenValue)
        token.value = responseData.tokenValue

        // 更新用户信息状态 (至少存储 loginId)
        // 可以根据需要从后端获取更完整的 user profile，或者先只存 ID
        user.value = {
          id: responseData.loginId, // 存储用户主键
          // 其他用户信息字段可以后续通过 fetchUserProfile 获取并填充
          // email: credentials.email, // 也可以暂时存入登录邮箱
        }

        // 将 token 存储到 localStorage
        localStorage.setItem('satoken', token.value) // 存储 tokenValue
        setFaceVerified(false) // 登录后强制要求人脸识别
        console.log('登录成功 (Store)，Token 已存储，Login ID:', user.value.id)
        await router.push({ name: 'face-verify' }) // 登录后跳转到人脸识别
        return true // 表示成功
      } else {
        // --- 登录失败或响应格式不符 ---
        // 获取错误消息，优先使用 msg 字段，否则使用默认消息
        const errorMessage = response.data?.msg || '邮箱或密码错误，或服务器响应异常'
        loginError.value = errorMessage
        console.log('登录失败 (Store):', errorMessage)
        return false
      }
    } catch (error) {
      console.error('登录 API 请求失败:', error)
      // 处理请求本身的错误 (网络问题、服务器 500 等)
      const errorMessage =
        error.response?.data?.msg || error.response?.data?.message || '登录请求失败，请稍后重试'
      loginError.value = errorMessage
      return false
    }
  }

  // 注册操作
  async function register(userData) {
    registerError.value = null
    try {
      console.log('[DEBUG] 注册操作 - 开始注册，数据:', userData)
      const response = await api.register(userData)
      console.log('[DEBUG] 注册操作 - 服务器响应:', response)

      // 后端成功响应格式为 { "code": 0, "msg": null, "data": "用户注册成功" }
      if (response.data && response.data.code === 0) {
        // 注册成功 (通常注册成功后不会直接登录，需要用户手动登录)
        console.log('注册成功')
        // 可以选择跳转回登录页或显示成功消息
        return response.data
      } else {
        const errorMessage =
          response.data?.msg || response.data?.message || '注册失败，请检查输入信息'
        registerError.value = errorMessage
        console.log('[DEBUG] 注册操作 - 业务错误:', errorMessage)
        return response.data || { code: -1, msg: errorMessage, data: null }
      }
    } catch (error) {
      console.error('注册 API 请求失败:', error)
      console.log('[DEBUG] 注册操作 - 错误详情:', {
        status: error.response?.status,
        statusText: error.response?.statusText,
        headers: error.response?.headers,
        data: error.response?.data,
      })
      registerError.value = error.response?.data?.message || '注册请求失败，请稍后重试'
      return false
    }
  }

  // 退出登录操作
  function logout() {
    token.value = null
    user.value = null
    localStorage.removeItem('satoken') // 从 localStorage 移除 token
    setFaceVerified(false)
    console.log('已退出登录，Token 已移除')
    // 跳转回登录页
    router.push({ name: 'auth' })
  }

  // 应用加载时检查本地存储的 Token (可选但推荐)
  // 这个函数可以在 App.vue 的 onMounted 钩子中调用一次
  async function checkAuthOnLoad() {
    const storedToken = localStorage.getItem('satoken')
    if (storedToken) {
      token.value = storedToken
      // 自动获取用户信息
      try {
        const res = await api.getUserInfo()
        if (res.data && res.data.code === 0) {
          user.value = res.data.data
        }
      } catch {
        user.value = null
      }
    }
  }

  function setFaceVerified(val) {
    faceVerified.value = val
    localStorage.setItem('faceVerified', val ? 'true' : 'false')
  }

  // 返回 state, getters, actions 供组件使用
  return {
    token,
    user,
    loginError,
    registerError,
    isAuthenticated,
    login,
    register,
    logout,
    checkAuthOnLoad,
    faceVerified,
    setFaceVerified,
  }
})
